/**
 * 数组的reduce高阶函数方法
 * reduce(fn,[p])
 * 1、p为fn函数的形参的第一个参数的初始值，匿名函数的第一个参数值如果不填写默认为被循环数组的第一个下标的值
 * 2、匿名函数体中如果有return返回值，将作为下一次循环体中匿名函数形参的默认值
 * 3、匿名函数x,如果p有值就为数组的第一个值，没有就为第二个值
 */

/**
 * 用法：数组的累加
 */
let sum = [1, 2, 3, 4, 5, 6].reduce((s, x) => s + x)
// console.log(sum)
/**
 *合并数组元素 
 */
let concatArr = [[1], [2], [3]].reduce((s, x) => s.concat(x), []);
// console.log(concatArr)

/**
 * 去重
 */
let qc = [1, 2, 2, 3, 1, 3, 4, 5, 5, 6, 7, 4, 7, 8, 9, 9, 10, 6].reduce((prev, next) => {
    if (!prev.includes(next)) {
        prev.push(next);
    }
    return prev;
}, []);
// console.log(qc);

/**
 * 求最大值
 * 
 */
let maxVal = [1, 2, 99, 19, 0, 30].reduce((prev, next) => prev > next ? prev : next);
// console.log(maxVal)

/**
 * 字符出现的频次
 * "abcaabbddeecc"计算a,b,c,d出现的频次
 */
const pinCi = (str) => {
    let strList = str.split(""), pcSum = null;
    pcSum = strList.reduce((prev, next) => {
        prev[next] ? prev[next]++ : prev[next] = 1
        return prev;
    }, {});
    return pcSum;
}
// console.log(pinCi("abcaabbddeecc"));